# 显式等待
"""
概念：定位指定元素时，如果能定位到元素则直接返回该元素，不触发等待；
如果不能定位到该元素，则间隔一段时间后再去定位元素；
如果在达到最大时长时还没有找到指定元素，则抛出超时异常 TimeoutException
在Selenium中把显式等待的相关方法封装在WebDriverWait类中
"""
import time

"""
实现方式
1. 导包 等待类 --> from selenium.webdriver.support.wait import WebDriverWait
2. WebDriverWait(driver, timeout, poll_frequency=0.5)
1). driver：浏览器驱动对象
2). timeout：超时的时长，单位：秒
3). poll_frequency：检测间隔时间，默认为0.5秒
3. 调用方法 until(method)：直到...时
1). method：函数名称，该函数用来实现对元素的定位
2). 一般使用匿名函数来实现：lambda x: x.find_element_by_id("userA")
4. element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA")
)
"""
# 需求：打开注册A页面，完成以下操作
# 1).使用显式等待定位用户名输入框，如果元素存在，就输入admin

from selenium import webdriver
# 导包，等待类
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
# 放大浏览器页面
driver.maximize_window()
# 访问地址
driver.get("http://121.43.169.97:8848/pageA.html")

# 实例化WebDriverWait，并调用until(method)方法
# 1). driver：浏览器驱动对象
# 2). timeout：超时的时长，单位：秒
# 3). poll_frequency：检测间隔时间，默认为0.5秒
# username = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_css_selector("#userA"))
# username.send_Keys("admin")

# 显示等待
wait = WebDriverWait(driver, 10, 1)
# 定位
username = wait.until(lambda x: x.find_element_by_css_selector("#userA"))
# 写入
username.send_keys("admin")

time.sleep(3)
driver.quit()

# 显式与隐式区别
# 1. 作用域：隐式为全局元素，显式等待为单个元素有效
# 2. 使用方法：隐式等待直接通过驱动对象调用，而显式等待方法封装在WebDriverWait类中
# 3. 达到最大超时时长后抛出的异常不同：隐式为NoSuchElementException，显式等待为TimeoutException

